/******************************************/
// *工 程:G4Basic
// *作 者:Wanglei
// *日 期:2022-07-20
// *概 述:略
/******************************************/
// G4提供的头文件
#include "G4RunManager.hh"      // G4运行管理器
#include "FTFP_BERT.hh"         // G4默认物理列表

#include "G4UImanager.hh"       // 用户界面交互接口
#include "G4UIExecutive.hh"     // 用户界面的管理类
#include "G4VisExecutive.hh"    // 可视化界面管理类
#include "G4MTRunManager.hh"    // 多线程管理类
// 用户编写的头文件
#include "G4BasicDetectorConstruction.hh"   // 物理模型建模类
#include "G4BasicActionInitialization.hh"   // 粒子行为管理类
int main(int argc,char** argv){

    // 创建一个UI界面管理类，用来管理可或是化与批处理
    G4UIExecutive* ui = nullptr;

    // 如果仅执行运行语句，不传入其他文件，则给ui赋值。如果不只一条参数，则ui仍为空指针。
    if(argc == 1)
        ui = new G4UIExecutive(argc, argv);

    // 创建运行对象
    auto * runManager = new G4RunManager;

    // 运行对象参数配置
    // （一）建模
    runManager->SetUserInitialization(new G4BasicDetectorConstruction);
    // （二）物理过程
    runManager->SetUserInitialization(new FTFP_BERT);
    // （三）初级事件
    runManager->SetUserInitialization(new G4BasicActionInitialization);

    // G4内核初始化
    runManager->Initialize();

    // 创建可视化管理工具
    auto visManager = new G4VisExecutive;
    // 初始化可视化管理工具
    visManager->Initialise();

    // 创建UI交互管理器，并接管当前的界面管理
    G4UImanager* UImanager = G4UImanager::GetUIpointer();

    if(!ui){    // 如果ui为空指针，即表示终端执行有两个以上的参数，此时为批处理模式
        G4String command = "/control/execute ";     // 将ApplyCommand执行外部文件的命令储存在字符串中
        G4String file = argv[1];                    // 将外部文件储存在file字符串中
        UImanager->ApplyCommand(command + file);    // 执行批处理文件的命令
    }
    else{       // 如果ui指针不为空,说明终端只有一个参数，此时运行在可视化模式
        UImanager->ApplyCommand("/control/execute vis.mac");   // 执行外部文件中的可视化命令
        ui->SessionStart();                                    // 启动可视化界面
        delete ui;      // 释放内存
    }

    // runManager->BeamOn(100);

    // 释放内存
    delete visManager;
    delete UImanager;
    delete runManager;

    // main函数返回值
    return 0;
}
